<!DOCTYPE html>
<html lang="en">
<head>
        <meta charset="utf-8" />
        <title>T-appendix.git-introduction</title>
        <link rel="stylesheet" href="/theme/css/main.css" />

        <!--[if IE]>
            <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
        <![endif]-->
</head>

<body id="index" class="home">
        <header id="banner" class="body">
                <h1><a href="/">PythonTutorials </a></h1>
                <nav><ul>
                    <li><a href="/category/cpp.html">cpp</a></li>
                    <li class="active"><a href="/category/python.html">python</a></li>
                </ul>
                </nav>
        </header><!-- /#banner -->
<section id="content" class="body">
  <article>
    <header>
      <h1 class="entry-title">
        <a href="/T-appendix.git-introduction.html" rel="bookmark"
           title="Permalink to T-appendix.git-introduction">T-appendix.git-introduction</a></h1>
    </header>

    <div class="entry-content">
<footer class="post-info">
        <span>Mon 06 April 2020</span>
<span>| tags: <a href="/tag/python.html">python</a><a href="/tag/progarmming.html">progarmming</a><a href="/tag/excel.html">Excel</a></span>
</footer><!-- /.post-info -->      <h1>Git 简介</h1>
<p>--- You should've learned Git yesterday.</p>
<p><img alt="123" src="https://raw.githubusercontent.com/selfteaching/the-craft-of-selfteaching/master/images/git-time-machine-cover.png?raw=true"></p>
<h2>内容目标</h2>
<p>再一次，这一篇内容的目标，依然不是 “教程”，而是 “教程” 的 “图例” —— 如果我们把真正的教程比喻成 “地图” 的话。最全面的 Git 教程在网上，<strong>Pro Git</strong>，是免费的 —— 把它反复阅读若干遍，理解完整：</p>
<blockquote>
<p>https://git-scm.com/book/en/v2</p>
</blockquote>
<p>并且还有各种语言的翻译版本 —— 也包括中文。</p>
<h2>为什么你必须学会使用 Git？</h2>
<p>Git 是一个分布式版本控制软件 —— 听起来也许跟你没关系，但<strong>无论是谁</strong>，都会因为能够使用 Git 而节约时间、提高效率。进而，如果你居然没有一个活跃的 <a href="https://github.com">Github</a> 账户，那么你正在错过人类史上前所未有的共同协作时代 —— 半点都没有夸张。同样提供 Git 工具云服务的还有 <a href="https://gitlab.com">Gitlab</a>, <a href="https://bitbucket.org">Bitbucket</a> 等等。</p>
<p>并且，<a href="https://github.com">Github</a> 很可能是地球上第一个给人们提供 “<a href="Part.3.F.social-selfteaching.md">用作品社交</a>” 方式的平台，你若是不能参与其中，实在是太可惜了！</p>
<h2>从逻辑上理顺 Git 基本命令</h2>
<p>Git 的作用，基本上可以被划分为三部分：</p>
<blockquote>
<ul>
<li>备份文件</li>
<li>跟踪文件变化</li>
<li>与他人协作共同操作文件</li>
</ul>
</blockquote>
<p>在一个 git 仓库中，总计有四个 “抽象层”，它们分别是：</p>
<blockquote>
<ul>
<li>upstream repository 保存在云端的仓库</li>
<li>local repository 本地仓库</li>
<li>staging area 缓存区</li>
<li>working directory 工作区</li>
</ul>
</blockquote>
<p>其中，<code>local repository</code> 和 <code>staging area</code> 这两个抽象层的数据，保存在 <code>working directory</code> 根目录下的一个隐藏目录 <code>.git/</code> 下；需要使用 <code>ls -a</code> 才能看到。</p>
<p>当你使用 <code>git init</code> 命令将一个本地文件夹 <code>working directory</code> 初始化为 <code>local repository</code> 的之后，该文件夹内部的结构如下：</p>
<div class="highlight"><pre><span></span>.
└── .git
    ├── HEAD
    ├── config
    ├── description
    ├── hooks
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── fsmonitor-watchman.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   ├── pre-receive.sample
    │   ├── prepare-commit-msg.sample
    │   └── update.sample
    ├── info
    │   └── exclude
    ├── objects
    │   ├── info
    │   └── pack
    └── refs
        ├── heads
        └── tags
</pre></div>


<p>以下示意图中仅包含最基本的 Git 命令 —— 并且基本上都是独自使用 Git 时的常用命令。</p>
<p><img alt="123" src="https://raw.githubusercontent.com/selfteaching/the-craft-of-selfteaching/master/images/git-command-relationships.png?raw=true"></p>
<p>在工作区 <code>working directory</code> 这个抽象层中，你完成各种日常工作，创建、编辑、删除…… 你可能需要用某个编辑器去修改文件，你也可能频繁使用各种 Bash 命令，如，<code>rm</code> <code>mkdir</code> <code>cp</code> <code>mv</code> 等等。</p>
<p>时不时，你可能会把一些处理完的文件 “加入缓存区”；等一个阶段的工作完成之后，你可能会把那些已经放入缓存区的文件<strong>提交</strong>到（commit）本地仓库；而后继续工作…… 根据情况，你也会将本地仓库的文件<strong>推到</strong>（push）云端，即，远端仓库。如果，你正在与他人协作，你也可能经常需要从云端<strong>下拉</strong>（pull）最新版本到本地。</p>
<h2>Git 的安装</h2>
<h3>Mac</h3>
<p>Mac 的操作系统 Mavericks (10.9) 以上版本中都内建有 Git，你可以在 Terminal 中通过以下命令查看是否有 Git：</p>
<div class="highlight"><pre><span></span>git --version
which git
</pre></div>


<p>也可以通过 Homebrew 安装最新版本的 Git：</p>
<div class="highlight"><pre><span></span>ruby -e <span class="s2">&quot;</span><span class="k">$(</span>curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install<span class="k">)</span><span class="s2">&quot;</span>
brew doctor
brew install git
</pre></div>


<p>还可以通过 Conda 安装：</p>
<div class="highlight"><pre><span></span>conda install -c anaconda git
</pre></div>


<h3>Windows</h3>
<p>前往 https://gitforwindows.org 下载并安装 Git for Windows。</p>
<p>此外，它还会提供 Git Bash —— 在 Windows 操作系统中使用与 *Nix 操作系统一样的 Bash 命令行工具。</p>
<p>另外，在 Windows 操作系统中推荐使用 Git Bash 或者 PowerShell，而非 CMD 作为命令行工具。</p>
<h3>Linux</h3>
<p>大多数 Linux 操作系统要么基于 Debain，要么基于 Red-Hat —— 请自行查看 <a href="https://en.wikipedia.org/wiki/List_of_Linux_distributions">List of Linux distributions</a>，确定自己的 Linux 发行版究竟基于哪一个。</p>
<p>基于 Debian 的 Linux 发行版：</p>
<div class="highlight"><pre><span></span>sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git
</pre></div>


<p>基于 Red-Hat 的 Linux 发行版：</p>
<div class="highlight"><pre><span></span>sudo yum upgrade
sudo yum install git
</pre></div>


<h3>Git 本地配置</h3>
<p>在命令行工具中执行以下命令：</p>
<div class="highlight"><pre><span></span>git config --global user.name <span class="s2">&quot;&lt;your_name&gt;&quot;</span>
git config --global user.email &lt;your_email_address&gt;
</pre></div>


<h3>Git GUI</h3>
<p>Git 的图形化版本客户端，有很多种选择，以下几个跨平台的客户端最受欢迎：</p>
<blockquote>
<ul>
<li><a href="https://desktop.github.com">Github Desktop</a></li>
<li><a href="https://gitahead.github.io/gitahead.com/">GitAhead</a></li>
<li><a href="https://git-fork.com">Fork</a></li>
<li><a href="https://www.gitkraken.com">GitKraken</a></li>
</ul>
</blockquote>
<p>更多选择，请移步查看 <a href="https://git-scm.com/downloads/guis/">git-scm.com 上的 Git GUI Clients 列表</a>。</p>
<h3>需要了解的 Bash 基本命令</h3>
<p>虽然 Git 也有图形化版本，但无论如何你都会接触到命令行工具。并且，谁都一样，早晚会遇到非使用命令行不可的情况。</p>
<p>以下是常用 Bash 命令的简要说明：</p>
<table>
<thead>
<tr>
<th>命令</th>
<th>简要说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>cd</code></td>
<td>Change Directory 的缩写；转到指定目录</td>
</tr>
<tr>
<td><code>ls</code></td>
<td>List 的缩写；列出当前目录中的内容</td>
</tr>
<tr>
<td><code>mkdir</code></td>
<td>Make Directory 的缩写；在当前目录中创建一个新的目录</td>
</tr>
<tr>
<td><code>pwd</code></td>
<td>Present Working Directory 的缩写；显示当前工作目录</td>
</tr>
<tr>
<td><code>touch</code></td>
<td>创建一个指定名称的空新文件</td>
</tr>
<tr>
<td><code>rm</code></td>
<td>Remove 的缩写；删除指定文件</td>
</tr>
<tr>
<td><code>rmdir</code></td>
<td>Remove Directory 的缩写；删除指定目录</td>
</tr>
<tr>
<td><code>cp</code></td>
<td>Copy 的缩写；拷贝指定文件</td>
</tr>
<tr>
<td><code>mv</code></td>
<td>Move 的缩写；移动指定文件</td>
</tr>
<tr>
<td><code>cat</code></td>
<td>Concatenate 的缩写；在屏幕中显示文件内容</td>
</tr>
<tr>
<td><code>chmod</code></td>
<td>Change Mode 的缩写；改变文件的权限</td>
</tr>
<tr>
<td><code>man</code></td>
<td>Manual 的缩写；显示指定命令的使用说明</td>
</tr>
</tbody>
</table>
<p>其中，<code>chmod</code> 最常用的 4 个权限分别是：</p>
<table>
<thead>
<tr>
<th>文件权限模式</th>
<th>简要说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>777</code></td>
<td>任何人都可以读、写、执行该文件</td>
</tr>
<tr>
<td><code>755</code></td>
<td>任何人都可以读、执行该文件，但只有所有者可以修改</td>
</tr>
<tr>
<td><code>700</code></td>
<td>只有所有者才能进行读、写、执行操作</td>
</tr>
<tr>
<td><code>+x</code></td>
<td>将文件设置为可执行</td>
</tr>
</tbody>
</table>
<p>在使用 <code>man</code> 命令时，系统会使用 vim 文本编辑工具以只读模式打开帮助文件，常用键盘命令如下：</p>
<table>
<thead>
<tr>
<th>键盘命令</th>
<th>简要说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>f</code></td>
<td>向后翻屏</td>
</tr>
<tr>
<td><code>b</code></td>
<td>向前翻屏</td>
</tr>
<tr>
<td><code>d</code></td>
<td>向后翻半屏</td>
</tr>
<tr>
<td><code>u</code></td>
<td>向前翻半屏</td>
</tr>
<tr>
<td><code>j</code></td>
<td>向后翻一行</td>
</tr>
<tr>
<td><code>k</code></td>
<td>向前翻一行</td>
</tr>
<tr>
<td><code>h</code></td>
<td>查看 vim 帮助</td>
</tr>
<tr>
<td><code>q</code></td>
<td>退出</td>
</tr>
</tbody>
</table>
<h2>一些不错的 Git 教程</h2>
<p>除了 Pro Git 这本书之外，还有很多值得去看：</p>
<blockquote>
<ul>
<li><a href="http://ndpsoftware.com/git-cheatsheet.html">GIT CHEATSHEET -- an interaction from nop software</a></li>
<li><a href="https://learngitbranching.js.org/">Learn Git Branching</a></li>
<li><a href="https://livebook.manning.com/#!/book/learn-git-in-a-month-of-lunches/about-this-book/">Learn Git in a Month of Lunches</a></li>
<li><a href="https://githowto.com/">Git How To</a></li>
<li><a href="http://justinhileman.info/article/git-pretty/">Git pretty - Solve Git Mess</a></li>
<li><a href="http://onlywei.github.io/explain-git-with-d3/">Visualizing Git Concepts with D3</a></li>
</ul>
</blockquote>
<p>当然，你肯定早晚会去 Github 上找 “Awesome Git”：</p>
<blockquote>
<p>https://github.com/dictcp/awesome-git</p>
</blockquote>
    </div><!-- /.entry-content -->

  </article>
</section>
        <section id="extras" class="body">
                <div class="blogroll">
                        <h2>blogroll</h2>
                        <ul>
                            <li><a href="http://getpelican.com/">Pelican</a></li>
                            <li><a href="http://python.org/">Python.org</a></li>
                            <li><a href="http://jinja.pocoo.org/">Jinja2</a></li>
                            <li><a href="#">You can modify those links in your config file</a></li>
                        </ul>
                </div><!-- /.blogroll -->
                <div class="social">
                        <h2>social</h2>
                        <ul>

                            <li><a href="#">You can add links in your config file</a></li>
                            <li><a href="#">Another social link</a></li>
                        </ul>
                </div><!-- /.social -->
        </section><!-- /#extras -->

        <footer id="contentinfo" class="body">
                <p>Powered by <a href="http://www.maxiaoan.com/">Maxiaoan</a></p>
        </footer><!-- /#contentinfo -->

</body>
</html>